package Model.Gates;

import Model.Main.Wire;
import java.util.logging.Level;

public class AndGate extends Gate {

    /**
     *konstruktor
     *
     */
    public AndGate(String name) {
        this.name = name;
        maxInputs = 2;
        this.reset();
        logger.log(Level.CONFIG, "" + this.getClass().getName() + " " + this.getName() + " created with " + maxInputs + " input(s).");
        /**
         * Inicializáljuk az inputsWired listát.
         */
        initInputsWired();
    }

    /**
     *konstruktor
     *
     */
    public AndGate(int maxInputs, String name) {
        this.name = name;
        this.maxInputs = maxInputs;
        this.reset();
        logger.log(Level.CONFIG, "" + this.getClass().getName() + " " + this.getName() + " created with " + maxInputs + " input(s).");
        /**
         * Inicializáljuk az inputsWired listát.
         */
        initInputsWired();
    }

    /**
     * A bemenetek beállítása. (paraméterben a bemenet száma és értéke) Ezt hívja meg a wire
     * @param inputNumber A bemenet száma. (Hányadik bemenetet akarjuk állítani)
     * @param val A bemenet értéke.
     * @return
     * 
     */
    @Override
    public void setInput(int inputNumber, Boolean val) throws Exception {
        // meghívjuk a superclassban lévő függvényt, ami az értéket, a stabilitást
        // állítja be, és a loggolást végzi el.
        super.setInput(inputNumber, val);
        // elég 1 stabil input ha false, tuti false lesz az output.
        if (val == false) {
            this.val = false;
            logger.log(Level.FINEST, "" + this.getClass().getName() + " " + this.getName() + " has value " + this.val + " and sending out on wire " + this.outputWire + ".");
            // elküldöm az értéket
            outputWireSendValue();
        } else {
            // ha az érték nem false, akkor megnézzük stabil-e minden láb.
            // ha valamelyik nem stabil, false lesz a tempVal
            Boolean tempVal = true;
            for (Boolean stable : inputsStable) {
                tempVal = tempVal && stable;
            }

            // ha a tempval true, akkor végigiterálunk az inputokon,
            // ezzel kiszámoljuk a jelet, és utána elküldjük.
            if (tempVal == true) {
                for (Boolean values : inputs) {
                    val = val && values;
                }
                this.val = val;
                logger.log(Level.FINEST, "" + this.getClass().getName() + " " + this.getName() + " has value " + this.val + " and sending out on wire " + this.outputWire + ".");
                // csak akkor küld adatot, ha van outputwire.
                // elküldöm az értéket
                outputWireSendValue();
            } else {
                // egyébként nem csinálunk semmit,
                // mert nem voltak stabilak az inputok.
                logger.log(Level.FINEST, "" + this + " can not send value, inputs not stable.");
            }
        }



    }
}
